home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_12 / winroth / exc_sig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-20  |  3.6 KB  |  135 lines

  1. /*
  2. ** Exception Library -- General exception handling for ANSI C programs
  3. ** 
  4. ** Copyright (C) 1992 Computational Vision and Active Perception Lab. (CVAP),
  5. **                    Royal Institute of Technology, Stockholm.
  6. **
  7. ** This library is free software; you can redistribute it and/or
  8. ** modify it under the terms of the GNU Library General Public
  9. ** License as published by the Free Software Foundation; either
  10. ** version 2 of the License, or (at your option) any later version.
  11. ** 
  12. ** This library is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. ** Library General Public License for more details.
  16. ** 
  17. ** You should have received a copy of the GNU Library General Public
  18. ** License along with this library (see COPYING-LIB); if not, write to 
  19. ** the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
  20. ** USA.
  21. ** 
  22. **                            Written by
  23. **                                 
  24. **                  Harald Winroth, Matti Rendahl
  25. **      Computational Vision and Active Perception Laboratory
  26. **                  Royal Institute of Technology
  27. **                        S-100 44 Stockholm
  28. **                              Sweden
  29. **                                 
  30. ** Report bugs to candela-bug@bion.kth.se, and direct all inquiries to 
  31. ** candela@bion.kth.se.
  32. **
  33. */
  34.  
  35. #include <stdio.h>
  36.  
  37. #include <exception/exc-sig-macros.h>
  38.  
  39. int exc_sig_type;
  40.  
  41. /*
  42.  * Let _EXC_SIG expand to a declaration AND a definition
  43.  */
  44.  
  45. #undef _EXC_SIG
  46. #define _EXC_SIG(LIST)                                   \
  47.     _EXC_SIG_DECLARE(LIST);                              \
  48.     _EXC_SIG_DEFINE(LIST);                              \
  49.     _EXC_SIG_HANDLER(LIST)                              \
  50.  
  51. #include <exception/exc-sig.h> /* exc-sig-macros.h will not be read again */
  52.  
  53. char *exc_sig_name (excSig sig)
  54. {
  55.     return sig.name;
  56. }
  57.  
  58. int exc_sig_number (excSig sig)
  59. {
  60.     return sig.number;
  61. }
  62.  
  63. int exc_sig_exception_handler (void *e, void *e_type, void *h_data)
  64. {
  65.     excSig es;
  66.  
  67.     if (!EXC_IN_DOMAIN (e_type, exc_sig_type))
  68.     exc_rethrow ();
  69.  
  70.     es = *(excSig *)e;
  71.  
  72.     fprintf (stderr, "\nexc_sig: Received %s (signal %d)\n", 
  73.          exc_sig_name (es), exc_sig_number (es));
  74.  
  75.     return 1;
  76. }
  77.  
  78. excSigHandler exc_signal (int sig)
  79. {
  80.     static int exception_handler_installed = 0;
  81.  
  82.     if (!exception_handler_installed)
  83.     {
  84.     EXC_INSTALL_HANDLER (exc_any, exc_sig_exception_handler, NULL);
  85.     exception_handler_installed = 1;
  86.     }
  87.  
  88. #if defined(SVR4) || defined(SYSV) || defined(_SYSV_)
  89.    {
  90.        
  91.        sigset_t mask;
  92.        struct sigaction act, old_act;
  93.  
  94.        if (sigemptyset (&mask))
  95.        exc_fatal ("exc_signal: sigemptyset() failed.");
  96.  
  97.        act.sa_handler = exc_sig_handler;
  98.        act.sa_mask = mask;
  99.        act.sa_flags = SA_NODEFER | SA_SIGINFO;
  100.  
  101.        if (sigaction (sig, &act, &old_act))
  102.        exc_fatal ("exc_signal: sigaction() failed.");
  103.  
  104.        return old_act.sa_handler;
  105.    }
  106. #else
  107.     return signal (sig, exc_sig_handler);
  108. #endif
  109. }
  110.  
  111. #if defined(SVR4) || defined(SYSV) || defined(_SYSV_)
  112. void exc_signals (sigset_t *set)
  113. #define SIG_IS_MEMBER(SET, SIG) sigismember (SET, SIG)
  114. #else
  115. void exc_signals (int set)
  116. #define SIG_IS_MEMBER(SET, SIG) ((SET) & sigmask (SIG))
  117. #endif
  118. {
  119.   /*
  120.    * This is not completely portable, but neither is the rest of the 
  121.    * exception/signal stuff here...
  122.    */
  123.  
  124.   int nsignals = sizeof(exc_sig)/sizeof(excSig);
  125.   excSig *arr = (excSig *) &exc_sig;
  126.   int i;
  127.  
  128.   for (i=0; i<nsignals; i++)
  129.     if (SIG_IS_MEMBER (set, arr[i].number))
  130.     (void) exc_signal (arr[i].number);
  131. }
  132.  
  133. #undef SIG_IS_MEMBER
  134.  
  135.